查看原文
其他

【缺陷周话】第 38期——不安全的反序列化:XStream

奇安信代码卫士 代码卫士 2022-04-06

 聚焦源代码安全,网罗国内外最新资讯!


*声明:《缺陷周话》栏目系列文章由奇安信代码卫士团队原创出品。未经许可,禁止转载。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。


代码审计是使用静态分析发现源代码中安全缺陷的方法,辅助开发或测试人员在软件上线前较为全面地了解安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并已成为安全开发生命周期 SDL 和 DevSecOps 等保障体系的重要技术手段。

奇安信代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对 CWE、OWASP 等标准中的一类缺陷,结合实例和工具使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。

缺陷周话 • 第38期

不安全的反序列化:XStream


       1、不安全的反序列化:XStream

通常客户端向服务端发送XML格式请求的数据时,在服务端对数据处理时并不是直接对数据进行处理,而是将XML转换成程序中可操作的对象。在转换时需要用到XStream,XStream可以将对象序列化成XML或将XML反序列化为对象。在使用XStream进行反序列化时,如果程序中没有校验用户输入就进行反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在创建过程中可能会引发任意代码执行等问题。本文以JAVA语言源代码为例,分析“不安全的反序列化:XStream”漏洞产生的原因以及修复方法。详见 CWE ID 502: Deserialization of Untrusted Data (http://cwe.mitre.org/data/definitions/502.html)。



 2、不安全的反序列化:XStream的危害


攻击者可使用“不安全的反序列化:XStream”漏洞,通过修改序列化之后的数据字段,进行提权、越权操作或者替换缓存服务器中的数据,恶意修改服务器数据,严重的可导致远程代码执行问题。

从2019年1月至2019年6月,CVE中共有38条漏洞信息与其相关。部分漏洞如下:

CVE概述

CVE-2019-7091

ColdFusion版本Update 1,Update 7,Update 15对不受信任的数据进行了反序列化。成功利用可能导致任意代码执行。

CVE-2019-4279

IBM WebSphereApplication Server 8.5和9.0可能允许远程攻击者使用来自不受信任来源的特制序列化对象在系统上执行任意代码。

CVE-2019-10912

Symfony在2.8.50,3.4.26之前的3.x,4.1.12之前的4.x和4.2.7之前的4.2.x,可以缓存可能包含错误用户输入的对象。在序列化或反序列化时,这可能导致删除当前用户有权访问的文件。


    3、示例代码


示例源于 WebGoat-8.0.0.M25 (https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project),源文件名:VulnerableComponentsLesson.java。

3.1 缺陷代码


上述示例代码是获取到用户输入的 XML 数据并将该数据反序列化为对象,在第54行获取用户输入的 XML 字符串 payload,第57行使用 dom 解析器来构造 XStream 对象 xstream,第58行使用 Contact 类加载器作为 XStream 的类加载器,第60行将 Contact.class配置给 XStream,XStream 可以识别 Contact 类的注解。在第87行调用 fromXML 方法将 XML 字符串 payload 反序列化为 Contact 类的对象 expl

当以下 XML 文档传入 fromXML 中,将执行 ProcessBuilder 对象实例化,并调用 start()方法从而运行 Windows 计算器。

<contact> <dynamic-proxy> <interface>org.company.model.Contact</interface> <handler class="java.beans.EventHandler"> <target class="java.lang.ProcessBuilder"> <command> <string>calc.exe</string> </command> </target> <action>start</action> <handler> </dynamic-proxy></contact>


使用代码卫士对上述示例代码进行检测,可以检出“不安全的反序列化:XStream”缺陷,显示等级为高。在代码行第87行报出缺陷如图1所示:


图1:"不安全的反序列化: XStream" 检测示例

3.2 修复代码


在上述修复代码中,在第61行调用 allowTypeHierarchy 方法为反序列化类 Contact 添加安全权限避免不安全的反序列化。

使用代码卫士对修复后的代码进行检测,可以看到已不存在“不安全的反序列化:XStream”缺陷。如图2所示:

图2:修复后检测结果


4、如何避免不安全的反序列化:XStream


(1) 采用白名单策略,只允许白名单上的对象生成,不允许生成未经定义的对象。

(2) 对序列化对象执行完整性检查和加密处理,防止被恶意篡改和创建恶意对象。

(3) 反序列化过程之前执行严格的类型限制。




推荐阅读

【缺陷周话】第 37期:未初始化值用于赋值操作

【缺陷周话】第 36 期:弱验证

【缺陷周话】第 35 期:除数为零

【缺陷周话】第 34 期:重定向

【缺陷周话】第 33期:错误的资源关闭

【缺陷周话】第 32期:弱加密

【缺陷周话】第 31 期:错误的内存释放方法

【缺陷周话】第 30 期:不安全的哈希算法

【缺陷周话】第 29 期:返回栈地址

【缺陷周话】第 28 期:被污染的内存分配

【缺陷周话】第 27 期:不安全的随机数

【缺陷周话】第 26期:被污染的格式化字符串

【缺陷周话】第 25期:硬编码密码

【缺陷周话】第 24期:在scanf 函数中没有对 %s 格式符进行宽度限制

【缺陷周话】第 23期:双重检查锁定

【缺陷周话】第 22期:错误的内存释放对象

【缺陷周话】第 21 期:数据库访问控制

【缺陷周话】第 20 期:无符号整数回绕

【缺陷周话】第19期:LDAP 注入

【缺陷周话】第18 期  XPath 注入

【缺陷周话】第17 期:有符号整数溢出

【缺陷周话】第 16 期 — 资源未释放:流

【缺陷周话】第 15 期 — 资源未释放:文件

【缺陷周话】第 14 期 :HTTP 响应截断

【缺陷周话】第 13期 :二次释放

【缺陷周话】第 12期 :存储型 XSS

【缺陷周话】第 11期 :释放后使用

【缺陷周话】第 10 期 :反射型 XSS

【缺陷周话】第 9 期 :缓冲区下溢

【缺陷周话】第 8 期 :路径遍历

【缺陷周话】第 7 期 :缓冲区上溢

【缺陷周话】第 6 期 :命令注入

【缺陷周话】第5期 :越界访问

【缺陷周话】第4期 :XML 外部实体注入

【缺陷周话】第3期 :内存泄漏

【缺陷周话】第 2 期 :SQL 注入

【缺陷周话】第1期 :空指针解引用


*奇安信代码卫士团队原创出品。未经许可,禁止转载。转载请注明“转自奇安信代码卫士 www.codesafe.cn”。



奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的产品线。




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存